#include <stdlib.h>
#include <stdio.h>

void imprimir_vec(int *vec, int n){
	int i;
	for (i = 0; i < n; i++)	{
		printf("%d, ",*vec);
    vec++;
	}
	printf("\n");
}
void swap(int *a, int *b){
  int aux;
  aux = *a;
  *a = *b;
  *b = aux;
} 

int* burbuja(int ls[], int n){
  int i, j;
  for (i = 0; i < n-1; i++){
    for (j = i+1; j < n; j++){
      if (ls[i] > ls[j]){
        swap(&ls[i],&ls[j]);
      }
    }
  }
  return ls;
}

// metodo seleccion
int posMenor(int ls[], int i, int n){
  int j, posm;
  posm = i;
  for (j = i+1; j < n; j++){
    if (ls[j] < ls[posm]){
      posm = j;
    }
  }
  return posm;
 }

int* seleccion(int ls[], int n){
  int i, posm;
  for (i = 0; i < n; i++){
    posm = posMenor(ls,i,n);
    swap(&ls[i],&ls[posm]);
  }
  return ls;
}

// end seleccion

int* insercion(int list[], int n){
    int i, j;
    for (i = 1; i < n; i++){
      j=i;
      while (j>0 && list[j] < list[j-1]){
        swap(&list[j], &list[j-1]);
        j -= 1;
      }
    }
    return list;
}

int* shell_sort(int lista[], int n){
  int k, i;
  k=n/2;
  while (k>0){
    i=0;
    while (i+k<n){
      if (lista[i]>lista[i+k])
        swap(&lista[i], &lista[i+k]);
      i += 1;
    }
    k /= 2;
  }
  return lista;
}


int main (int argc, char *argv[])
{
  int n=6;
  int vec[n];
  vec[0]=30;
	vec[1]=10;
	vec[2]=5;
	vec[3]=6;
	vec[4]=20;
	int *b;
  b=burbuja(vec,5);
  printf("burbuja\n");
  imprimir_vec(b,5); 
  b=seleccion(vec,5);
  printf("seleccion\n");
  imprimir_vec(b,5); 
  printf("insercion\n");
  b=insercion(vec,5);
  imprimir_vec(b,5);
  printf("shell_sort\n");
  b=shell_sort(vec,5);
  imprimir_vec(b,5);    

  return 0;
}
